import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;

public class zhq {
    public static void main(String[] args) {
        // 先检查是否有足够的参数
        if (args.length == 0) {
            System.out.println("ByUsi开发\n");
            System.out.println("使用方法: \n（转换成二进制）     zhq -z 源文件 输出文件名\n（转换成16进制）     zhq -z16 源文件 输出文件名\n（从二进制还原文件） zhq -h 源文件 输出文件名\n（从16进制还原文件） zhq -h16 源文件 输出文件名");
            return;
        }

        // 检查参数数量和格式
        if (args.length != 3 && !"-byusi".equals(args[0])) {
            System.out.println("ByUsi开发\n");
            System.out.println("使用方法: \n（转换成二进制）     zhq -z 源文件 输出文件名\n（转换成16进制）     zhq -z16 源文件 输出文件名\n（从二进制还原文件） zhq -h 源文件 输出文件名\n（从16进制还原文件） zhq -h16 源文件 输出文件名");
            return;
        }

        if ("-byusi".equals(args[0])) {
            showEasterEgg();
            return;
        }

        String sourceFile = args[1];
        String outputFile = args[2];

        try {
            if ("-z".equals(args[0])) {
                // 将文件内容转换为二进制并输出
                convertToBinary(sourceFile, outputFile);
            } else if ("-z16".equals(args[0])) {
                // 将文件内容转换为十六进制并输出
                convertToHex(sourceFile, outputFile);
            } else if ("-h".equals(args[0])) {
                // 将二进制内容还原为文件
                convertFromBinary(sourceFile, outputFile);
            } else if ("-h16".equals(args[0])) {
                // 将十六进制内容还原为文件
                convertFromHex(sourceFile, outputFile);
            }
            System.out.println("文件已成功输出到: " + outputFile);
        } catch (IOException e) {
            System.err.println("文件操作出错: " + e.getMessage());
        }
    }

    private static void convertToBinary(String sourceFile, String outputFile) throws IOException {
        try (FileInputStream fis = new FileInputStream(sourceFile);
             PrintWriter pw = new PrintWriter(new FileOutputStream(outputFile))) {

            int byteData;
            StringBuilder outputBuilder = new StringBuilder();

            while ((byteData = fis.read()) != -1) {
                String outputString = String.format("%8s", Integer.toBinaryString(byteData))
                                            .replace(' ', '0');
                outputBuilder.append(outputString).append(" ");
            }

            pw.print(outputBuilder.toString().trim());
        }
    }

    private static void convertToHex(String sourceFile, String outputFile) throws IOException {
        try (FileInputStream fis = new FileInputStream(sourceFile);
             PrintWriter pw = new PrintWriter(new FileOutputStream(outputFile))) {

            int byteData;
            StringBuilder outputBuilder = new StringBuilder();

            while ((byteData = fis.read()) != -1) {
                String outputString = String.format("%02X", byteData);
                outputBuilder.append(outputString).append(" ");
            }

            pw.print(outputBuilder.toString().trim());
        }
    }

    private static void convertFromBinary(String sourceFile, String outputFile) throws IOException {
        byte[] bytes = Files.readAllBytes(Paths.get(sourceFile));
        String[] binaryStrings = new String(bytes).split(" ");
        try (FileOutputStream fos = new FileOutputStream(outputFile)) {
            for (String binaryString : binaryStrings) {
                int byteData = Integer.parseInt(binaryString, 2);
                fos.write(byteData);
            }
        }
    }

    private static void convertFromHex(String sourceFile, String outputFile) throws IOException {
        byte[] bytes = Files.readAllBytes(Paths.get(sourceFile));
        String[] hexStrings = new String(bytes).split(" ");
        try (FileOutputStream fos = new FileOutputStream(outputFile)) {
            for (String hexString : hexStrings) {
                int byteData = Integer.parseInt(hexString, 16);
                fos.write(byteData);
            }
        }
    }

    private static void showEasterEgg() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("当前版本: 1.3.2");
        System.out.println("更新日志: 添加了二进制和十六进制转换功能，并支持将它们还原为原始文件。");
        System.out.println("请问你叫什么名字？");
        System.out.print("输入您的名字: ");
        String name = scanner.nextLine();
        System.out.println("很高兴认识你, " + name + "！如果有任何问题，请随时联系 ByUsi 支持团队。");
        System.out.println("520World 链接：https://520world.byusi.cn");
        System.out.println("感谢使用 ByUsi 工具，祝你工作顺利！");
    }

    private static String centerText(String text) {
        int consoleWidth = 80; // 假设控制台宽度为80字符
        int padding = (consoleWidth - text.length()) / 2;
        String paddingStr = " ".repeat(Math.max(0, padding));
        return paddingStr + text;
    }
}
